int ConCom (ImSize, MaxMark, InIm, MarkIm, EquLst)
int  ImSize, MaxMark;
BYTE ** InIm;
int  ** MarkIm;
int  *  EquLst;
{
   int  r,c, yu,xu,yc,xc,yl,xl, U,C,L, Mark, Um,Lm;
 
   for (r=0; r<ImSize; r++)
      for (c=0; c<ImSize; c++)  MarkIm[r][c] = 0;

   for (r=0; r<ImSize; r++) InIm[r][0] = 0;
   for (c=0; c<ImSize; c++) InIm[0][c] = 0;
   for (r=0; r<ImSize; r++) InIm[r][ImSize-1] = 0;
   for (c=0; c<ImSize; c++) InIm[ImSize-1][c] = 0;

   Mark = 0;
   GetMem (EquLst);
   EquLst[Mark] = Mark;
   for (r=1; r<ImSize-1; r++) {
      for (c=1; c<ImSize-1; c++) {
         yu = r-1;  xu = c;
         yc = r;    xc = c;
         yl = r;    xl = c-1;
         U = (int) InIm [yu][xu];
         C = (int) InIm [yc][xc];
         L = (int) InIm [yl][xl];
         if (C) {
            if (C==U && C!=L) {
               MarkIm [yc][xc] = MarkIm [yu][xu];
            }else{
               if (C==L && C!=U) {
                  MarkIm [yc][xc] = MarkIm [yl][xl];
               }else{
                  if (C==L && C==U) {
                     Lm = MarkIm [yl][xl];
                     Um = MarkIm [yu][xu];
                     MarkIm [yc][xc] = Lm;
                     if (Lm!=Um) {
                        Lm = LastMark (EquLst, Lm);
                        Um = LastMark (EquLst, Um);
                        EquLst [Lm] = Um;
                     }
                  }else{ /*(!L && !U)*/
                     Mark++;
                     MarkIm [yc][xc] = Mark;
                     GetMem (EquLst);
                     EquLst[Mark] = Mark;
   }  }  }  }  }  }
Leave:
   return (Mark);
}
